package tests;


import static org.junit.Assert.assertTrue;

import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Date;

import ordenamiento.OrdenamientoPorPrecioASC;
import ordenamiento.OrdenamientoPorPrecioDESC;

import org.junit.Before;
import org.junit.Test;

import vuelo.Vuelo;
import vuelo.VueloConEscala;
import vuelo.VueloDirecto;
import asiento.Asiento;

public class OrdenamientoPorPrecioTest {
	
	OrdenamientoPorPrecioASC ordenASC = new OrdenamientoPorPrecioASC();
	OrdenamientoPorPrecioDESC ordenDESC = new OrdenamientoPorPrecioDESC();
	Asiento asiento1,asiento2,asiento3;
	VueloDirecto vueloDirecto1,vueloDirecto2,vueloDirecto3;
	VueloConEscala vueloEscala1,vueloEscala2,vueloEscala3;
	ArrayList<Vuelo> colVuelosDirectos1 = new ArrayList<Vuelo>();
	ArrayList<Vuelo> colVuelosDirectos2 = new ArrayList<Vuelo>();
	Collection<VueloDirecto> colVuelosDirectos4 = new ArrayList<VueloDirecto>();
	Collection<VueloDirecto> colVuelosDirectos5 = new ArrayList<VueloDirecto>();
	ArrayList<Vuelo> colVuelosDirectos3 = new ArrayList<Vuelo>();
	ArrayList<VueloConEscala> colVuelosConEscala = new ArrayList<VueloConEscala>();
	Collection<Vuelo> colVuelos = new ArrayList<Vuelo>();
	Collection<Vuelo> colVuelosMezclados = new ArrayList<Vuelo>();

	@Before
	public void setUp() throws Exception {
		asiento1=new Asiento();
		asiento1.setFechaLlegada(new Date());
		asiento1.setFechaSalida(new Date());
		asiento1.setPrecio(new BigDecimal(20));
		vueloDirecto1=new VueloDirecto("vuelo1",asiento1);
		vueloDirecto1.addAsiento(asiento1);
		colVuelosDirectos1.add(vueloDirecto1);
		
		
		asiento2=new Asiento();
		asiento2.setFechaLlegada(new Date());
		asiento2.setFechaSalida(new Date());
		asiento2.setPrecio(new BigDecimal(50));
		vueloDirecto2=new VueloDirecto("vuelo2",asiento2);
		vueloDirecto2.addAsiento(asiento2);
		colVuelosDirectos1.add(vueloDirecto2);
		
		asiento3=new Asiento();
		asiento3.setFechaLlegada(new Date());
		asiento3.setFechaSalida(new Date());
		asiento3.setPrecio(new BigDecimal(15));
		vueloDirecto3=new VueloDirecto("vuelo3",asiento3);
		vueloDirecto3.addAsiento(asiento3);
		colVuelosDirectos1.add(vueloDirecto3);
		
		//VueloEscala 1
		// vuelo1 = 20
		// vuelo2 = 504
		// total =  70
		colVuelosDirectos4.add(vueloDirecto1);
		colVuelosDirectos4.add(vueloDirecto2);
		vueloEscala1 = new VueloConEscala(colVuelosDirectos4);
		colVuelos.add(vueloEscala1);
		
		//VueloEscala 2
		// vuelo1 = 20
		// vuelo3 = 15
		// total =  35
		//vueloEscala2 = new VueloConEscala(colVuelosDirectos22);
		//vueloEscala2.addVuelosDirectos(vueloDirecto1);
		//vueloEscala2.addVuelosDirectos(vueloDirecto3);
		colVuelosDirectos5.add(vueloDirecto1);
		colVuelosDirectos5.add(vueloDirecto3);
		vueloEscala2 = new VueloConEscala(colVuelosDirectos5);
		colVuelos.add(vueloEscala2);
		
		//Agregue dos vuelos directos y dos con escala
		colVuelosMezclados.add(vueloDirecto1);
		colVuelosMezclados.add(vueloDirecto2);
		colVuelosMezclados.add(vueloEscala1);
		colVuelosMezclados.add(vueloEscala2);
		
		
	}
	
	@Test
	public void ordenamientoVuelosDirectosPrecioASC() {
		
		VueloDirecto vueloOrdenado = (VueloDirecto) ((ArrayList<Vuelo>) ordenASC.ordenar(colVuelosDirectos1)).get(0);
		assertTrue(vueloOrdenado.damePrecioMaximo().equals(new BigDecimal(15)));
		
	}
	
	@Test
	public void ordenamientoVuelosDirectosPrecioDESC() {
		
		VueloDirecto vueloOrdenado = (VueloDirecto) ((ArrayList<Vuelo>) ordenDESC.ordenar(colVuelosDirectos1)).get(0);
		assertTrue(vueloOrdenado.damePrecioMaximo().equals(new BigDecimal(50)));
		
	}
	
	@Test
	public void ordenamientoVuelosConEscalaPrecioASC() {
		VueloConEscala vueloOrdenado = (VueloConEscala) ((ArrayList<Vuelo>)ordenASC.ordenar(colVuelos)).get(0);		
		assertTrue(vueloOrdenado.damePrecioMaximo().equals(new BigDecimal(35)));
	}
	
	@Test
	public void ordenamientoVuelosConEscalaPrecioDESC() {
		VueloConEscala vueloOrdenado = (VueloConEscala) ((ArrayList<Vuelo>)ordenDESC.ordenar(colVuelos)).get(0);		
		assertTrue(vueloOrdenado.damePrecioMaximo().equals(new BigDecimal(70)));
	}
	
	@Test
	public void ordenamientoVuelosDirectosYConEscalasPrecioASC() {
		VueloDirecto vueloOrdenado = (VueloDirecto) ((ArrayList<Vuelo>)ordenASC.ordenar(colVuelosMezclados)).get(0);		
		assertTrue(vueloOrdenado.damePrecioMaximo().equals(new BigDecimal(20)));
	}
	
	@Test
	public void ordenamientoVuelosDirectosYConEscalasPrecioDESC() {
		VueloConEscala vueloOrdenado = (VueloConEscala) ((ArrayList<Vuelo>)ordenDESC.ordenar(colVuelosMezclados)).get(0);		
		assertTrue(vueloOrdenado.damePrecioMaximo().equals(new BigDecimal(70)));
	}

}
